/**
 * @file MedicamentoDAO.java
 * @brief Obtiene y actualiza la información de la BD referente a los Medicamentos.
 *
 * Copyright (C)  - April [2011]
 *
 * @author Miguel Ángel Díaz López
 * @version 01.00
 *
 * @footnote e-mail:  admin    at etsiit.es
 */


package GestorFarmacia;

import Definiciones.Definiciones;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.ArrayList;
import Servicios.Conexion;


/**
 * @class MedicamentoDAO
 * @brief Obtiene y actualiza la información de la BD referente a los Medicamentos.
 */
public class MedicamentoDAO {

    /* Métodos de clase */
    public static void add ( Medicamento m ) throws SQLException, IOException, ClassNotFoundException {
	String viaAdministracion = Definiciones.convertirViaAdministracion(m.getViaAdministracion());
        String estado = m.getEstadoMedicamento().toString();
        if(estado.equals("DISPONIBLE")) estado = "d";
        else estado = "n";
        Conexion.conectar();
        Conexion.actualizar("INSERT Medicamento(categoria,nombre,DCIoMarca,viaAdministracion,"
                            + "dosisPorUnidad,umbralExistencias,cantidadTipica,estado)"
                            + " VALUES (\'"+ m.getCategoriaMedicamento().toString().toLowerCase()+"\'"
                            + ",\'" +m.getNombreMedicamento()+ "\'"
                            + ",\'" +m.getDCI()+ "\'"
                            + ",\'" +viaAdministracion+ "\'"
                            + "," +m.getDosisPorUnidad()
                            + "," +m.getUmbralExistenciasMedicamento()
                            + "," +m.getCantidadTipicaMedicamento()
                            + ",\'" +estado+ "\');");
	Conexion.desconectar();
    }

    public static void delete ( Medicamento m ) throws SQLException, IOException, ClassNotFoundException {
        // Borrado lógico del medicamento
        m.setEstadoMedicamento(Definiciones.Estado.NO_DISPONIBLE);
        Medicamento.update(m);/*
        Conexion.conectar();
	Conexion.actualizar("DELETE FROM Medicamento WHERE idMedicamento="+m.getIdMedicamento()+";");
        Conexion.desconectar();*/
    }
    
    public static void update ( Medicamento m ) throws SQLException, IOException, ClassNotFoundException {
	String viaAdministracion = Definiciones.convertirViaAdministracion(m.getViaAdministracion());
        String estado = m.getEstadoMedicamento().toString();
        if(estado.equals("DISPONIBLE")) estado = "d";
        else estado = "n";
        Conexion.conectar();
	Conexion.actualizar("UPDATE Medicamento SET categoria=\'" + m.getCategoriaMedicamento().toString().toLowerCase() + "\'"
                                                 + ", nombre=\'" + m.getNombreMedicamento() + "\'"
                                                 + ", DCIoMarca=\'" + m.getDCI() + "\'"
                                                 + ", viaAdministracion=\'" + viaAdministracion + "\'"
                                                 + ", dosisPorUnidad=" + m.getDosisPorUnidad()
                                                 + ", umbralExistencias=" + m.getUmbralExistenciasMedicamento()
                                                 + ", cantidadTipica=" + m.getCantidadTipicaMedicamento()
                                                 + ", estado=\'" + estado + "\'"
                                                 + "WHERE idMedicamento="+m.getIdMedicamento()+";");
	Conexion.desconectar();
    }

    public static Medicamento get ( Integer id_medicamento ) throws SQLException, IOException, ClassNotFoundException {
        Medicamento medicamento_buscado = null;
        Conexion.conectar();
	ResultSet medicamento = Conexion.consultar("SELECT * FROM Medicamento WHERE Medicamento.idMedicamento="+id_medicamento+";");
	// Creamos el Medicamento consultado de la BD
        if(medicamento.next()){
            medicamento_buscado = new Medicamento();
            Definiciones.Estado estado;
            if(medicamento.getString("estado").equals("d"))estado = Definiciones.Estado.DISPONIBLE;
            else estado = Definiciones.Estado.NO_DISPONIBLE;
            medicamento_buscado.setIdMedicamento(medicamento.getInt("idMedicamento"));
            medicamento_buscado.setCategoriaMedicamento(Definiciones.convertirATC(medicamento.getString("categoria")));
            medicamento_buscado.setNombreMedicamento(medicamento.getString("nombre"));
            medicamento_buscado.setDCI(medicamento.getString("DCIoMarca"));
            medicamento_buscado.setViaAdministracion(Definiciones.convertirViaAdministracion(medicamento.getString("viaAdministracion")));
            medicamento_buscado.setDosisPorUnidad(medicamento.getInt("dosisPorUnidad"));
            medicamento_buscado.setUmbralExistenciasMedicamento(medicamento.getInt("umbralExistencias"));
            medicamento_buscado.setCantidadTipicaMedicamento(medicamento.getInt("cantidadTipica"));
            medicamento_buscado.setEstadoMedicamento(estado);
        }
        Conexion.desconectar();
        return medicamento_buscado;
    }

    public static Medicamento[] get ( Definiciones.ATC cat, String nombre, String DCI, Definiciones.ViaAdministracion via,
                                      Integer dosis, Integer umbral, Integer cantidad_tipica, Definiciones.Estado estado) throws SQLException, IOException, ClassNotFoundException {
        Medicamento[] v_medicamentos = null;
        String busqueda = "";
        ArrayList<Medicamento> l_medicamentos = new ArrayList<Medicamento>();
        Definiciones.Estado estado_;
        ResultSet medicamento;
        
        // Generamos la consulta a la BD
        if(cat != null) busqueda += "categoria=\'" + Definiciones.convertirATC(cat) + "\'";
        if(nombre != null){
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "nombre=\'" + nombre + "\'";
        }
        if(DCI != null){
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "DCIoMarca=\'" + DCI + "\'";
        }
        if(via != null){
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "viaAdministracion=\'" + Definiciones.convertirViaAdministracion(via) + "\'";
        }
        if(dosis != null){
            if(!busqueda.equals("")) busqueda += " AND ";
             busqueda += "dosisPorUnidad=" + dosis;
        }
        if(umbral != null){
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "umbralExistencias=" + umbral;
        }
        if(cantidad_tipica != null){
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "cantidadTipica=" + cantidad_tipica;
        }
        if(estado != null){
            if(!busqueda.equals("")) busqueda += " AND ";
            if(estado.toString().equals("DISPONIBLE")) busqueda += "estado=\'d\'";
            else busqueda += "estado=\'n\'";
        }
        Conexion.conectar();
	if(!busqueda.equals("")) medicamento = Conexion.consultar("SELECT * FROM Medicamento WHERE " + busqueda + ";");
        else medicamento = Conexion.consultar("SELECT * FROM Medicamento");

	// Creamos el listado de Medicamentos
        while(medicamento.next()){
            if(medicamento.getString("estado").equals("d"))estado_ = Definiciones.Estado.DISPONIBLE;
            else estado_ = Definiciones.Estado.NO_DISPONIBLE;
            l_medicamentos.add(new Medicamento(medicamento.getInt("idMedicamento"),Definiciones.convertirATC(medicamento.getString("categoria")),
                               medicamento.getString("nombre"),medicamento.getString("DCIoMarca"),Definiciones.convertirViaAdministracion(medicamento.getString("viaAdministracion")),
                               medicamento.getInt("dosisPorUnidad"),medicamento.getInt("umbralExistencias"),medicamento.getInt("cantidadTipica"),estado_));
        }
        Conexion.desconectar();
        
        // Devolvemos vector de medicamentos
        if(l_medicamentos.size()>0){
            v_medicamentos = new Medicamento[l_medicamentos.size()];
            l_medicamentos.toArray(v_medicamentos);
        }
        return v_medicamentos;
    }
}
